home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ V5.02 / GDIDEMO.PAK / BITBLT.CPP < prev    next >
C/C++ Source or Header  |  1997-05-06  |  4KB  |  183 lines

  1. //----------------------------------------------------------------------------
  2. // ObjectWindows
  3. // Copyright (c) 1991, 1995 by Borland International, All Rights Reserved
  4. //
  5. //   TBitBltWindow demo window object for GDIDEMO program
  6. //----------------------------------------------------------------------------
  7. #include <owl/pch.h>
  8. #include <owl/applicat.h>
  9. #include <owl/dc.h>
  10. #include "bitblt.h"
  11. #include <stdlib.h>
  12. #include <math.h>
  13.  
  14. // TBitBltWindow ----------------------------------------------------
  15.  
  16. DEFINE_RESPONSE_TABLE1(TBitBltWindow, TBaseDemoWindow)
  17.   EV_WM_SIZE,
  18. END_RESPONSE_TABLE;
  19.  
  20. IMPLEMENT_CASTABLE1(TBitBltWindow, TBaseDemoWindow);
  21.  
  22. //
  23. // Initialize the bitblt demo window and allocate bitmaps
  24. //
  25. TBitBltWindow::TBitBltWindow()
  26. :
  27.   TBaseDemoWindow()
  28. {
  29.   Background = new TBitmap(*GetApplication(), BackgroundId);
  30.   Ship = new TBitmap(*GetApplication(), ShipId);
  31.   MonoShip = new TBitmap(*GetApplication(), MonoShipId);
  32.   ScratchBitmap = 0;
  33.   StretchedBkgnd = 0;
  34.   OldX = 0;
  35.   OldY = 0;
  36.   X = 0;
  37.   Y = 0;
  38.   Delta = 5;
  39.   CurClick = 1;
  40. }
  41.  
  42. //
  43. // Dispose of all used resources
  44. //
  45. TBitBltWindow::~TBitBltWindow()
  46. {
  47.   delete Background;
  48.   delete Ship;
  49.   delete MonoShip;
  50.   delete ScratchBitmap;
  51.   delete StretchedBkgnd;
  52. }
  53.  
  54. //
  55. // Allocate scratch bitmaps
  56. //
  57. void
  58. TBitBltWindow::SetupWindow()
  59. {
  60.   TBaseDemoWindow::SetupWindow();
  61.   TClientDC winDC(*this);
  62.   ScratchBitmap = new TBitmap(winDC, 80, 80);
  63.   StretchedBkgnd = new TBitmap(winDC, 1000, 1000);
  64. }
  65.  
  66. //
  67. // Record the new size and stretch the background to it
  68. //
  69. void
  70. TBitBltWindow::EvSize(uint sizeType, TSize& size)
  71. {
  72.   TBaseDemoWindow::EvSize(sizeType, size);
  73.   WindowSize.x = size.cx;
  74.   WindowSize.y = size.cy;
  75.  
  76.   TClientDC winDC(*this);
  77.  
  78.   // Create a stretched to fit background
  79.   //
  80.   TMemoryDC stretchedDC(winDC);
  81.   TMemoryDC memDC(winDC);
  82.   stretchedDC.SelectObject(*StretchedBkgnd);
  83.   memDC.SelectObject(*Background);
  84.  
  85.   // set the cursor to an hourglass - this might take awhile
  86.   //
  87.   HCURSOR oldCur = ::SetCursor(::LoadCursor(0, IDC_WAIT));
  88.   stretchedDC.StretchBlt(0, 0, WindowSize.x, WindowSize.y, 
  89.                          memDC, 0, 0, 100, 100, SRCCOPY);
  90.   ::SetCursor(oldCur);
  91.   Invalidate();
  92. }
  93.  
  94. //
  95. // Need to ensure that the Old copy of the ship gets redrawn with
  96. //  any paint messages.
  97. //
  98. void
  99. TBitBltWindow::Paint(TDC& dc, bool, TRect&)
  100. {
  101.   TMemoryDC memDC(dc);
  102.   memDC.SelectObject(*StretchedBkgnd);
  103.   dc.BitBlt(0, 0, WindowSize.x, WindowSize.y, memDC, 0, 0, SRCCOPY);
  104. }
  105.  
  106. //
  107. // TimerTick deletes the old position of the saucer and blt's a new one
  108. //
  109. void
  110. TBitBltWindow::TimerTick()
  111. {
  112.   const int ClicksToSkip = 4;
  113.  
  114.   // Make the saucer go slower then everyone else- only move on every 4th tick
  115.   //
  116.   if (CurClick < ClicksToSkip) {
  117.     CurClick++;
  118.     return;
  119.   }
  120.   else {
  121.     CurClick = 1;
  122.   }
  123.  
  124.   // Setup the DC's
  125.   //
  126.   TClientDC windowDC(*this);
  127.   TMemoryDC bits(windowDC);
  128.   TMemoryDC backingStore(windowDC);
  129.  
  130.   // Calculate the offsets into and dimensions of the backing store
  131.   //
  132.   CalculateNewXY();
  133.   int bx = min(X, OldX);
  134.   int by = min(Y, OldY);
  135.   int ox = abs(X - bx);
  136.   int oy = abs(Y - by);
  137.   int bw = BitmapSize + abs(OldX - X);
  138.   int bh = BitmapSize + abs(OldY - Y);
  139.  
  140.   // Create an image into the backing store the will that, when blt into
  141.   //  the window will both erase the old image and draw the new one.
  142.   //  (to minimize screen flicker)
  143.   //
  144.   backingStore.SelectObject(*ScratchBitmap);
  145.   bits.SelectObject(*StretchedBkgnd);
  146.   backingStore.BitBlt(0, 0, bw, bh, bits, bx, by, SRCCOPY);
  147.   bits.SelectObject(*MonoShip);
  148.   backingStore.BitBlt(ox, oy, BitmapSize, BitmapSize, bits, 0, 0, SRCAND);
  149.   bits.SelectObject(*Ship);
  150.   backingStore.BitBlt(ox, oy, BitmapSize, BitmapSize, bits, 0, 0, SRCPAINT);
  151.  
  152.   // Blt the backing store to the window
  153.   //
  154.   windowDC.BitBlt(bx, by, bw, bh, backingStore, 0, 0, SRCCOPY);
  155.  
  156.   OldX = X;
  157.   OldY = Y;
  158. }
  159.  
  160. //
  161. //
  162. //
  163. void
  164. TBitBltWindow::CalculateNewXY()
  165. {
  166.   if (WindowSize.x < BitmapSize)        // Don't move if too small
  167.     return;
  168.   if (X > WindowSize.x - BitmapSize || X < 0) {
  169.     Delta = -Delta;
  170.     if (X > WindowSize.x-BitmapSize)
  171.       X = WindowSize.x - BitmapSize - 5;
  172.   }
  173.   X += Delta;
  174.   Y += random(10) - 5;  // range from -5 to +5
  175.   if (Y > (WindowSize.y - BitmapSize)) {
  176.     Y = WindowSize.y - BitmapSize;
  177.   }
  178.   else {
  179.     if (Y < 0)
  180.       Y = 0;
  181.   }
  182. }
  183.